package com.sheng.leetcode.year2023.month05.day06;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2023/05/06
 * <p>
 * 1419. 数青蛙<p>
 * <p>
 * 给你一个字符串 croakOfFrogs，它表示不同青蛙发出的蛙鸣声（字符串 "croak" ）的组合。<p>
 * 由于同一时间可以有多只青蛙呱呱作响，所以 croakOfFrogs 中会混合多个 “croak” 。<p>
 * 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。<p>
 * 要想发出蛙鸣 "croak"，青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。<p>
 * 如果没有输出全部五个字母，那么它就不会发出声音。<p>
 * 如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成，请返回 -1 。<p>
 * <p>
 * 示例 1：<p>
 * 输入：croakOfFrogs = "croakcroak"<p>
 * 输出：1<p>
 * 解释：一只青蛙 “呱呱” 两次<p>
 * <p>
 * 示例 2：<p>
 * 输入：croakOfFrogs = "crcoakroak"<p>
 * 输出：2<p>
 * 解释：最少需要两只青蛙，“呱呱” 声用黑体标注<p>
 * 第一只青蛙 "crcoakroak"<p>
 * 第二只青蛙 "crcoakroak"<p>
 * <p>
 * 示例 3：<p>
 * 输入：croakOfFrogs = "croakcrook"<p>
 * 输出：-1<p>
 * 解释：给出的字符串不是 "croak" 的有效组合。<p>
 * <p>
 * 提示：<p>
 * 1 <= croakOfFrogs.length <= 10^5<p>
 * 字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'<p>
 * <p>
 * 来源：力扣（LeetCode）<p>
 * 链接：<a href="https://leetcode.cn/problems/minimum-number-of-frogs-croaking">1419. 数青蛙</a><p>
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。<p>
 */
public class LeetCode1419 {

    @Test
    public void test01() {
//        String croakOfFrogs = "croakcroak";
//        String croakOfFrogs = "crcoakroak";
        String croakOfFrogs = "croakcrook";
        System.out.println(new Solution().minNumberOfFrogs(croakOfFrogs));
    }
}

class Solution {
    public int minNumberOfFrogs(String croakOfFrogs) {
        // 字符串 croak 的正确组合，必须满足，当前位置上字符数量按照 c >= r >= o >= a >= k 的顺序
        // 青蛙数目，即字符 c 和 字符 k 在字符串中的最大差值
        int[] nums = new int[5];
        int max = -1;
        for (char c : croakOfFrogs.toCharArray()) {
            if (c == 'c') {
                nums[0]++;
            } else if (c == 'r') {
                nums[1]++;
            } else if (c == 'o') {
                nums[2]++;
            } else if (c == 'a') {
                nums[3]++;
            } else if (c == 'k') {
                nums[4]++;
            } else {
                return -1;
            }
            if (nums[0] >= nums[1] && nums[1] >= nums[2] && nums[2] >= nums[3] && nums[3] >= nums[4]) {
                max = Math.max(max, nums[0] - nums[4]);
            } else {
                return -1;
            }
        }
        if (nums[0] == nums[1] && nums[1] == nums[2] && nums[2] == nums[3] && nums[3] == nums[4]) {
            return max;
        } else {
            return -1;
        }
    }
}
